/*
 * serializable.h
 *
 *  Created on: 12/11/2011
 *      Author: utn_so
 */

#ifndef SERIALIZABLE_H_
#define SERIALIZABLE_H_

#include <stdint.h>

typedef struct {
	char * Data;
	int32_t Size;
} __attribute__((packed)) Serializable_t;

void Serializable_Free(Serializable_t *aSerializable);

typedef enum {
	msgHandShake, msgRead, msgWrite, msgInternal, msgSyncRead //msgInternal: para uso interno
} TypeMsg;

typedef struct {
	TypeMsg type;
	uint32_t auxiliar;
	uint32_t sectorRequest;
	uint32_t contentSize;
	char * content;
} __attribute__((packed)) Message;

//Funciones de serializacion de tipos de datos (Serialize_Type, Deserialize_Type)
void Serialize_Message(Serializable_t * aSerializable, Message aMessage);
void Deserialize_Message(Message *aMessage, Serializable_t aSerializable);

void Serializable_EditType(Serializable_t * aSerializable, TypeMsg newType);
void Serializable_EditAuxiliar(Serializable_t * aSerializable, uint32_t newAuxiliar);

uint32_t getSizeFromHeader(char * headerBuffer);
int32_t getSectorFromHeader(char * headerBuffer);
TypeMsg getTypeFromHeader(char * headerBuffer);

static const uint32_t HeaderSize = sizeof(TypeMsg)  + //type
								   sizeof(uint32_t) + //auxiliar
								   sizeof(uint32_t) + //sectorRequest
								   sizeof(uint32_t);  //contentSize


void Message_Copy(Message * msgTo, Message msgFrom);
void Message_Free(Message * msgTo);

#endif /* SERIALIZABLE_H_ */
